package util;

import frame.service.util.FrameUtil;
import http.RedisSession;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.concurrent.TimeUnit;

/**
 * Redis会话管理器
 * */
public class SessionManager {
    private static int sessionTimeout;
    private static String REDIS_SESSION_PREFIX = "SESSION:";

    private static StringRedisTemplate stringRedisTemplate;

    public static void setStringRedisTemplate(StringRedisTemplate stringRedisTemplate) {
        SessionManager.stringRedisTemplate = stringRedisTemplate;
    }

    /**
     * 更新会话有效时间
     * 机制：更新redis key失效时间为会话超时时长
     * */
    public static void sessionValid(RedisSession session){
        stringRedisTemplate.expire(REDIS_SESSION_PREFIX+session.getSessionKey(), sessionTimeout, TimeUnit.MINUTES);
    }

    /**
     * 更新会话内容
     * 机制：将会话信息转为JSON字符窜，存储至redis
     * */
    public static void sessionUpdate(RedisSession session){
        String s = FrameUtil.obj2json(session);
        stringRedisTemplate.opsForValue().set(REDIS_SESSION_PREFIX+session.getSessionKey(), s, sessionTimeout, TimeUnit.MINUTES);
    }

    /**
     * 根据sessionKey获取会话信息，转换为RedisSession
     * @see RedisSession
     * */
    public static RedisSession getSession(String sessionKey){
        String s = stringRedisTemplate.opsForValue().get(REDIS_SESSION_PREFIX+sessionKey);
        if(s ==null){
            return null;
        }
        RedisSession session = FrameUtil.str2Obj(s, RedisSession.class);
        SessionManager.sessionValid(session);
        return session;
    }

    public static void setSessionTimeout(int sessionTimeout){
        SessionManager.sessionTimeout = sessionTimeout;
    }
}
